/*
 * @Author: lande 615542329@qq.com
 * @Date: 2023-02-14 10:54:24
 * @LastEditors: lande 615542329@qq.com
 * @LastEditTime: 2023-02-21 14:08:51
 * @FilePath: \ScriptProjects\Mobile_Control_Terminal\main.js
 * @Description:
 * @PackageName：com.biyun.mobile.cn
 * @Sign: {user: biyun, password: biyun123456}
 * @Platform：mobile
 * @Version: 1.0.0
 */

const consoleUrl = "";
const apiKey = "";
let script1;
let exitConsole = false;
const Diy = new DiyFuncion();


// 判断是否有无障碍权限
Diy.isOpenAccessibility();

// 监听也是需要无障碍权限的
events.on("exit", () => {
  if (!exitConsole) {
    try {
      script1.getEngine().forceStop();
      // toastLog("APP_控制台代码引擎结束");
      engines.stopAllAndToast();
      // toastLog("停止所有正在运行的脚本");
    } catch (error) {
      log("程序结束");
    }
  }
});

//启用按键监听
events.observeKey();
//监听音量上键按下
events.onKeyDown("volume_up", (event) => {
  exitConsole = true;
  toastLog("音量上键被按下了");
  try {
    script1.getEngine().forceStop();
    // toastLog("APP_控制台代码引擎结束");
    engines.stopAllAndToast();
    // toastLog("停止所有正在运行的脚本");
  } catch (error) {
    log("程序结束");
  }
  exit();
});


/**
 * @description: 自定义函数类
 * @return {*}
 */
function DiyFuncion() {

  /**
   * @description: 判断是否开启无障碍权限，没有开启就跳到开启的界面
   * @return {*}
  */
  this.isOpenAccessibility = function () {
    while (!auto.service) {
      toastLog("无障碍权限未开启，请手动开启");
      app.startActivity({
        action: "android.settings.ACCESSIBILITY_SETTINGS",
      });

      sleep(3500);
    }
    home();
    sleep(2000);

  }

  /**
  * @description: 返回指定文件夹下的所有符合条件的文件。
  * @param {String} dir 文件夹路径，注意是文件夹路径，不是文件路径
  * @param {String} filesName 文件的部分文字，比如1001_1.txt, 填写1001
  * @param {String} regexp 正则表达式选择 1：filesName在开始部分；2：filesName在结尾部分；3：filesName中包含的部分。
  * @return {String[]} String[] 返回所有符合正则表达式的文件名数组。
  */
  this.listFiles = function (dir, filesName, regexp) {
    let filesList;
    let jsFiles = files.listDir(dir, function (name) {
      if (regexp == 1) {
        filesList = name.startsWith(filesName);
        return filesList;
      } else if (regexp == 2) {
        filesList = name.endsWith(filesName);
        return filesList;
      } else {
        filesList = name.indexOf(filesName) > -1 ? true : false;
        return filesList;
      }
    });
    return jsFiles;
  }

}
function Task() {

  /**
 * @description: // 请求并运行控制台代码
 * @return {*}
 */
  this.StartTask = function () {
    // 需要服务端告知开启/关闭任务控制台引擎。

    try {
      // ------------获取控制台代码---------------

      let responseConsole = http.postJson(consoleUrl);
      let scriptConsoleJson = responseConsole.body.json();
      let scriptCode = scriptConsoleJson["data"];
      // 控制台代码
      let consoleCode;
      let codePathDir = "/sdcard/code_console/";
      for (let t = 0; t < scriptCode.length; t++) {
        //  type=1 是控制台代码，type=2是库代码（diyfunc）
        if (scriptCode[t]["type"] == 1) {
          let consolePath =
            codePathDir + "console_" + scriptCode[t]["version"] + ".js";
          log("控制台代码路径=" + consolePath);
          // 判断当前是否存在这个版本了，存在就读取。
          if (files.exists(consolePath)) {
            consoleCode = files.read(consolePath);
            continue;
          }
          //  不存在就删除旧版本，写入新版本。
          consoleCode = scriptCode[t]["code"];

          // 删除旧版本的代码。
          files.ensureDir(codePathDir);
          let filesNameStart = "console_";
          let filesList = listFiles(codePathDir, filesNameStart, 1);
          for (let f = 0; f < filesList.length; f++) {
            let currFiles = codePathDir + filesList[f];
            files.remove(currFiles);
            sleep(100);
          }

          files.ensureDir(consolePath);
          sleep(100);
          // 把代码写入设备的文本文件
          files.write(consolePath, consoleCode);
        } else if (scriptCode[t]["type"] == 2) {
          let diyFuncPath =
            codePathDir + "diyFunc_" + scriptCode[t]["version"] + ".js";
          log("库代码路径=" + diyFuncPath);
          // 判断当前是否存在这个版本了，存在就跳过。
          if (files.exists(diyFuncPath)) {
            continue;
          }
          //  不存在就删除旧版本，写入新版本。
          let taskCode = scriptCode[t]["code"];
          files.ensureDir(codePathDir);
          let filesNameStart = "diyFunc_";
          let filesList = listFiles(codePathDir, filesNameStart, 1);
          for (let f = 0; f < filesList.length; f++) {
            let currFiles = codePathDir + filesList[f];
            files.remove(currFiles);
            sleep(100);
          }

          sleep(100);
          // 把库代码写入设备的文本文件
          files.write(diyFuncPath, taskCode);
        }
      }

      // let consoleCode = files.read("./console.js");
      script1 = engines.execScript("consoleCode", consoleCode);
      console.log("运行 控制台代码");
      sleep(2000);
    } catch (error) {
      console.log("请求控制台代码报错 = " + error);
      sleep(2000);
    }
  }

}

// 定时器 循环执行
let timeInterval;
clearInterval(Number(timeInterval));
timeInterval = setInterval(() => {
  toastLog("Auto mobile control terminal is running!");
}, 600000);

main();

/**
 * @description: 主函数
 * @return {*}
 */
function main() {
  toastLog("APP请求控制台代码");
  sleep(2000);
  StartTask();
}




